ホームに戻る
関連 :
C99 プリプロセッサディレクティブ
目次 :

インライン関数とは

関数の処理内容を呼び出し箇所に展開する機構。関数型マクロと類似する。
インライン関数は通常の関数呼び出しと異なりオーバーヘッドが発生しないので、通常の関数よりもはるかに高速に実行できる
反面、すべての呼び出し箇所に内容が展開されるため、インライン関数が長大、かつ呼び出し回数が多くなるとプログラムサイズが肥大化する
このため、ごく短い処理(getter / setter など)をインライン化するのが通例である
C++の機能であったが、C99で正式に言語仕様に組み込まれたためCでも使用可能である。

関数型マクロとの違い

// 関数型マクロ #define Mul(x, y) ( (x) * (y) ) // インライン関数 inline int Mul(int x, int y) { return x * y; }
関数型マクロでは展開箇所によらず所望の結果を得るためには括弧が必要で、記述が煩雑となりがちであるがインライン関数では括弧を必要としない
またインライン関数はコンパイラによる最適化の対象となるため、同様の処理を関数型マクロで実装した場合と比較して、多くの場合で高速となる
さらにインライン関数では通常の関数と同様、引数の型チェックを行うことができる。

インライン化

inline キーワードによるインライン化

// グローバルスコープのインライン関数 inline int Mul(int x, int y) { return x * y; } // クラス定義 class C_Hoge { private: U1 m_u1_Val; public: // 関数宣言 U1 GetVal(); } // 関数定義にてインライン化 inline U1 C_Hoge::GetVal() { return m_u1_Val; }
関数定義の前に inline キーワードを付与することで、インライン化を「要求」できる。
インライン化はあくまでも「要求」であるため、インライン化できないとコンパイラが判断した場合はインライン化されず、通常の関数となる。
(インライン化できない条件としては、再帰、goto文、switch文、変数、ループを含むなど。コンパイラにより異なる。)

自動インライン化 (クラスメンバ関数)

// クラス定義 class C_Hoge { private: U1 m_u1_Val; public: // 関数定義 ⇒ 自動インライン化 U1 GetVal() { return m_u1_Val; } }
クラス定義に関数定義を含めた場合、(可能であれば)インライン化される( inline キーワードによる場合と同様)。
このとき inline キーワードは必要ない(付与しても問題ないが、単に冗長である)。
関数定義に改行を含めないことで、インライン関数であることを示す記法がよく用いられる。